package com.shell.governor.security.user.service.impl;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.shell.bee.base.utils.StringUtil;
import com.shell.bee.base.utils.SystemUtil;
import com.shell.bee.cache.Cache;
import com.shell.bee.cache.CacheBuilder;
import com.shell.bee.entity.mvc.RetMsg;
import com.shell.framework.utils.CommonDataUtil;
import com.shell.framework.utils.VerifyCodeUtil;
import com.shell.governor.modules.message.keyword.SmsFindPasswordKeyWord;
import com.shell.governor.modules.util.MessageSender;
import com.shell.governor.security.user.service.SmsCheckService;
import com.shell.governor.security.user.util.SecurityCodeUtil;
import com.shell.governor.user.service.PubUserService;
import com.shell.governor.user.vo.PubUserVo;
import com.shell.governor.user.vo.UserQueryVo;

@Service
public class SmsCheckServiceImpl implements SmsCheckService {
	@Autowired
	PubUserService pubUserService;
	private static Cache<String, String> CACHE;

	public RetMsg smsCheck(String phoneNum, String smsCode) {
		UserQueryVo user = new UserQueryVo();
		user.setPhoneNo(phoneNum);
		String[] notState = { "D" };
		user.setNotStates(notState);
		List<PubUserVo> users = this.pubUserService.queryUser(user);
		if ((users == null) || (users.size() == 0)) {
			return new RetMsg("error", "����������");
		}
		if (CACHE == null) {
			return new RetMsg("warning", "����������������");
		}
		String cacheSmsCode = (String) CACHE.get(phoneNum);
		if (StringUtil.emptyAndNull(cacheSmsCode)) {
			return new RetMsg("warning", "����������������");
		}
		if (!cacheSmsCode.equals(smsCode)) {
			return new RetMsg("warning", "����������������");
		}
		String srecurityCode = SecurityCodeUtil.setCode();
		RetMsg retMsg = new RetMsg("success", true, "��������");
		Map<String, String> m = new HashMap<String, String>();
		m.put("srecurityCode", srecurityCode);
		retMsg.setBean(m);

		return retMsg;
	}

	public String getSmsCode(String phoneNum) {
		if (CACHE == null) {
			CACHE = CacheBuilder.newBuilder().build();
		}
		String smsCode = (String) CACHE.get(phoneNum);
		if (StringUtil.emptyAndNull(smsCode)) {
			smsCode = VerifyCodeUtil.generateVerifyCode(4, "0123456789");
			CACHE.put(phoneNum, smsCode, 300);
		}
		return smsCode;
	}

	public RetMsg checkSmsCode(String phoneNum, String smsCode) {
		if (CACHE == null) {
			return new RetMsg("warning", "����������������");
		}
		String cacheSmsCode = (String) CACHE.get(phoneNum);
		if (StringUtil.emptyAndNull(cacheSmsCode)) {
			return new RetMsg("warning", "����������������");
		}
		if (!cacheSmsCode.equals(smsCode)) {
			return new RetMsg("warning", "����������������");
		}
		return new RetMsg("success", true, "��������");
	}

	public RetMsg getSmsCodeForLogin(String phoneNo) {
		String smsCode = getSmsCode(phoneNo);
		UserQueryVo user = new UserQueryVo();
		user.setPhoneNo(phoneNo);
		String[] notState = { "D" };
		user.setNotStates(notState);
		List<PubUserVo> users = this.pubUserService.queryUser(user);
		if ((users == null) || (users.size() == 0)) {
			return new RetMsg("error", true, "��������" + phoneNo + "����������������", 3000);
		}
		try {
			SmsFindPasswordKeyWord keyWord = new SmsFindPasswordKeyWord();
			keyWord.setActiveTime("5");
			keyWord.setVerifyCode(smsCode);
			MessageSender.sendMessageToPhone(phoneNo, CommonDataUtil.getUserId(), "MT00136", keyWord);
		} catch (Exception e) {
			System.out.println("������������������������������" + e.getMessage());
			e.printStackTrace();
		}
		if (!SystemUtil.SystemMode.prod.equals(SystemUtil.getSystemMode())) {
			return new RetMsg("success", true, "����������������,��������" + smsCode);
		}
		return new RetMsg("success", true, "��������������������������������", 3000);
	}
}
